<?php

/**
 * Costante che definisce il nome standard del campo ID delle tabelle nel DB.
 */
if(!defined("STD_ID"))
	define("STD_ID", "ID");

/**
 * Classe che gestisce un array di parametri memorizzati nel DB
 */
class Parameters
{

	const PARAMETERS_TABLE_NAME = "ParametriGlobali";

	const PARAMETER_ADMIN_PASS = "AdminPassword";
	const PARAMETER_PRINT_HEADING = "PrintHeading";
	const PARAMETER_PRINT_LOGO = "PrintLogo";
	const PARAMETER_PRINT_SIGNATURE = "PrintSignature";
	const SECRET_PARAMETER_UPGRADE_SCRIPTS_ENABLED = "UpgradesEnabled";
	const PARAMETER_IVA = "IVA";
	public static $PARAMETERS_LIST = array(self::PARAMETER_ADMIN_PASS,
		self::PARAMETER_PRINT_HEADING, self::PARAMETER_PRINT_LOGO,
		self::PARAMETER_PRINT_SIGNATURE, self::PARAMETER_IVA);
	private static $SECRET_PARAMETERS_LIST = array(self::SECRET_PARAMETER_UPGRADE_SCRIPTS_ENABLED);
	public static $PARAMETERS_LONG_NAMES = array(
		self::PARAMETER_ADMIN_PASS => "Password di accesso:",
		self::PARAMETER_PRINT_HEADING => "Instestazione di ogni stampa:",
		self::PARAMETER_PRINT_LOGO => "Logo da usare nella stampa:",
		self::PARAMETER_PRINT_SIGNATURE => "Firma da usare nella stampa:",
		self::PARAMETER_IVA => "IVA");
	public static $PARAMETERS_DEFAULT_VALUES = array(
		self::PARAMETER_ADMIN_PASS => "flight",
		self::PARAMETER_PRINT_HEADING => "",
		self::PARAMETER_PRINT_LOGO => "",
		self::PARAMETER_PRINT_SIGNATURE => "F.LIGHT sas di C. Fucci",
		self::PARAMETER_IVA => "21");
	const PARAMETERS_COUNT = 4;

	private static $parameters = null;
	private static $parametersIDs = null;

	/**
	 * Inizializza i parametri caricandoli in memoria.
	 * @param DatabaseManager $db Database da cui prelevare i parametri.
	 */
	private static function initParameters($db)
	{
		$res = $db->EnumerateTableStart(self::PARAMETERS_TABLE_NAME);
		if($res != FALSE)
		{
			self::$parameters = array();
			self::$parametersIDs = array();
			while($db->EnumerateTableNext($res))
			{
				$vals = $db->EnumerateTableGetValues($res);
				if(in_array($vals["Nome"], self::$SECRET_PARAMETERS_LIST))
					continue;
				self::$parameters[$vals["Nome"]] = Utils::decode_quotes($vals["Valore"]);
				self::$parametersIDs[$vals["Nome"]] = $vals[STD_ID];
			}
			$i = 1;
			foreach(self::$PARAMETERS_LIST as $p)
			{
				if(!isset(self::$parameters[$p]))
				{
					self::$parameters[$p] = self::$PARAMETERS_DEFAULT_VALUES[$p];
					self::$parametersIDs = $i;
				}
				$i++;
			}
		}
	}

	/**
	 * Restituisce un parametro.
	 * @param DatabaseManager $db Database da cui prelevare i parametri.
	 * @param string $name Nome del parametro da restituire.
	 * @return string Valore del parametro richiesto o null in caso di errore.
	 */
	public static function getParameter($db, $name)
	{
		if(self::$parameters == null)
			self::initParameters($db);
		return self::$parameters != null && isset(self::$parameters[$name]) ? self::$parameters[$name] : null;
	}
	
	/**
	 * Restituisce l'ID di un parametro.
	 * @param DatabaseManager $db Database da cui prelevare i parametri.
	 * @param string $name Nome del parametro di cui restituire l'ID.
	 * @return int ID del parametro richiesto o null in caso di errore.
	 */
	public static function getParameterID($db, $name)
	{
		if(self::$parameters == null)
			self::initParameters($db);
		return self::$parametersIDs != null && isset(self::$parametersIDs[$name]) ? self::$parametersIDs[$name] : null;
	}

	/**
	 * Restituisce il numero di parametri presenti.
	 * @return int Il numero di parametri presenti.
	 */
	public static function getParametersCount()
	{
		return self::PARAMETERS_COUNT;
	}

	/**
	 * Restituisce un array associativo contenente tutti i parametri, dove ogni
	 * chiave rappresenta il nome del parametro ed il valore a quella chiave
	 * rappresenta il valore di quel parametro.
	 * @param DatabaseManager $db Database da cui prelevare i parametri.
	 * @return array L'array associativo di tutti i parametri.
	 */
	public static function getParametersList($db)
	{
		if(self::$parameters == null)
			self::initParameters($db);
		return self::$parameters;
	}

	/**
	 * Restituisce un array associativo contenente tutti gli ID dei parametri,
	 * dove ogni chiave rappresenta il nome del parametro ed il valore a quella
	 * chiave rappresenta l'ID di quel parametro.
	 * @param DatabaseManager $db Database da cui prelevare i parametri.
	 * @return array L'array associativo di tutti i parametri.
	 */
	public static function getParametersIDList($db)
	{
		if(self::$parametersIDs == null)
			self::initParameters($db);
		return self::$parametersIDs;
	}

	/**
	 * Imposta un nuovo valore ad un parametro aggiornando anche il DB.
	 * @param DatabaseManager $db Database da aggiornare.
	 * @param string $name Nome del parametro da aggiornare.
	 * @param string $value Nuovo valore del parametro.
	 * @return boolean Vero se la modifica è andata a buon fine, falso altrimenti.
	 */
	public static function setParameter($db, $name, $value)
	{
		if(self::$parameters == null)
			self::$parameters = array();
		if(isset(self::$parameters[$name]) && self::$parameters[$name] == $value)
			return true;
		self::$parameters[$name] = $value;
		return $db->UpdateRecord(self::PARAMETERS_TABLE_NAME, "Valore = '".Utils::encode_quotes($value)."'", "Nome = '".$name."'");
	}
	
	/**
	 * Imposta un nuovo valore ad un parametro aggiornando solo il DB.
	 * @param DatabaseManager $db Database da aggiornare.
	 * @param int $id ID del parametro da aggiornare.
	 * @param string $value Nuovo valore del parametro.
	 * @return boolean Vero se la modifica è andata a buon fine, falso altrimenti.
	 */
	public static function setParameterByID($db, $id, $value)
	{
		/*if(self::$parameters == null)
			self::$parameters = array();
		if(isset(self::$parameters[$name]) && self::$parameters[$name] == $value)
			return true;
		self::$parameters[$name] = $value;*/
		return $db->UpdateRecord(self::PARAMETERS_TABLE_NAME, "Valore = '".Utils::encode_quotes($value)."'", STD_ID." = ".$id);
	}

	/**
	 * Indica se gli script di upgrade sono abilitati.
	 * @param DatabaseManager $db Database da interrogare.
	 * @return boolean Restituisce vero se gli script di upgrade sono abilitati,
	 * falso altrimenti.
	 */
	public static function areUpgradeScriptsEnabled($db)
	{
		$res = $db->GetValueFromRecords(self::PARAMETERS_TABLE_NAME, "Valore", "Nome = '".self::SECRET_PARAMETER_UPGRADE_SCRIPTS_ENABLED."'" );
		return ($res === "true");
	}

}

?>
